#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

void ChildWrite(int wfd)
{
	char buff[1024];
	int cnt = 0;
	while (true)
	{
		snprintf(buff, sizeof(buff), "I am Child, my pid: %d, cnt: %d", getpid(), cnt++);
		write(wfd, buff, strlen(buff));
		sleep(1);
	}
}

void FatherRead(int rfd)
{
	char buff[1024];
	while (true)
	{
		buff[0] = 0;
		ssize_t n = read(rfd, buff, sizeof(buff) - 1);
		if (n > 0)
		{
			buff[n] = 0;
			std::cout << "Father get: " << buff << std::endl;
		}
	}
}

int main()
{
	// 1.创建管道
	int fds[2];
	int n = pipe(fds);
	if (n != 0)
	{
		std::cerr << "pipe error" << std::endl;
		return 1;
	}
	std::cout << "fds[0]: " << fds[0] << std::endl;
	std::cout << "fds[1]: " << fds[1] << std::endl;

	// 2.创建子进程
	pid_t id = fork();
	if (id == 0)
	{
		// child
		close(fds[0]);
		ChildWrite(fds[1]);//子进程写操作
		close(fds[1]);
		exit(0);
	}

	// 3.关闭不需要的读写端，形成通信信道
	close(fds[1]);
	FatherRead(fds[0]);//父进程读操作
	waitpid(id, nullptr, 0);
	close(fds[0]);

	return 0;
}